#include<stdio.h>
int ch[12] = { 31,0,31,30,31,30,31,31,30,31,30,31 };//二月比较特殊故空着依据后面输入的数值来赋值
int panduan(int year, int month, int day)//判断输入的值是否正确
{
    if (month > 12 || month < 0 || year < 0)
    {
        return 0;
    }
    else { ch[1] = 28; }
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)//判断是不是闰年
    {
        ch[1] = 29;
    }
    if (day > ch[month - 1])
    {
        return 0;
    }
    return 1;
}
int datetoweak(int year, int month, int day)//判断某个日期是星期几，由于利用了函数，输入年月日后不会对原值产生影响
{
    int weak;
    if (month == 1 || month == 2)
    {
        month += 12; year--;
    }
    weak = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7;
    return weak;
}
int main()
{
    int year, month, day, flag, weak = 0, temp = 0, count = 0, p=1;//count为要打印的数字，i则包含空格在内
    while (p)//死循环
    {
        printf("请输入要打印的万年历日期（用空格隔开）：");
        scanf("%d%d%d", &year, &month, &day);
        flag = panduan(year, month, day);
        if (flag == 0)//需要重新输入
        {
            printf("ERROR,请重新输入！");
            continue;
        }
        else//打印所需万年历
        {
            temp = datetoweak(year, month, 1);//判断这个月份的第一天是星期几
            printf("%d年\t%d月\t%d日\n", year, month, day);
            printf("  星期一  |  星期二  |  星期三  |  星期四  |  星期五  |  星期六  |  星期天  |\n");//打印表头
            int i = 0;
            for (; i < temp ; i++) { printf("          |"); }
            for (; count < day - 1; i++)
            {
                if (i % 7 == 0) { printf("\n"); }
                count++;
                printf("   %2d日   |", count);
            }
            if (i % 7 == 0) { printf("\n"); }
            count++; i++;
            printf("  *%2d日   |", count);//打印目标日期
            for (; count < ch[month - 1]; i++)
            {
                if (i % 7 == 0)printf("\n");
                count++; printf("   %2d日   |", count);            }
            printf("\n");
            printf("菜单：\n继续输入请输入1，结束请输入0: ");
                scanf("%d", &p);
        }
    }


    return 0;
}